package com.xxl.job.admin.service;

import com.job.common.DTO.JobFlowDTO;
import com.job.common.DTO.NodeJobDTO;
import com.xxl.job.admin.core.model.JobFlow;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.dao.JobFlowDao;
import com.xxl.job.admin.dao.XxlJobInfoDao;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @author songsong
 * @version 1.0
 * @date 2022/12/28 15:24
 **/
@Service
public class JobFlowService {
    @Resource
    XxlJobInfoDao xxlJobInfoDao;
    @Resource
    JobFlowDao jobFlowDao;

    @Transactional(rollbackFor = Exception.class)
    public void updateJobFlow(Map<Integer, NodeJobDTO.Node> nodeMap, JobFlowDTO jobFlowDTO) {
        /**
         * 判断jobFlowDto的id是否>0
         *      >0：更新任务流程数据
         *      =0：保存任务流程数据
         * 查询所有任务数据，
         * 遍历任务数据
         *      根据任务id获得节点信息(节点信息为空，说明此任务的子任务数据应为空)
         *      比对任务的子任务数据和节点的子节点信息，
         *      如果不一样，则将任务的子任务数据更新为节点的子节点信息
         *      一样，下一个任务
         */
        if (jobFlowDTO.getId() > 0) {
            jobFlowDao.update(jobFlowDTO);
        } else {
            jobFlowDao.save(jobFlowDTO);
        }
        List<XxlJobInfo> allJob = xxlJobInfoDao.getAllJob();
        List<XxlJobInfo> updateJobs = new ArrayList<>();
        allJob.forEach(item -> {
            NodeJobDTO.Node node = nodeMap.get(item.getId());
            if (node == null) {
                if (StringUtils.isNotEmpty(item.getChildJobId())) {
                    item.setChildJobId(null);
                    updateJobs.add(item);
                    return;
                }
            }else{
                if (!arrayStringEquals(node.getChildJobIds(),item.getChildJobId(),",")) {
                    item.setChildJobId(node.getChildJobIds());
                    updateJobs.add(item);
                }
            }
        });
        updateJobs.forEach(i -> xxlJobInfoDao.updateChildJobId(i));
    }

    private boolean arrayStringEquals(String a, String b,String splitStr) {
        if (StringUtils.isEmpty(a) && StringUtils.isEmpty(b)) {
            return true;
        }
        if (StringUtils.isNotEmpty(a) && StringUtils.isNotEmpty(b)) {
            String[] nodeArr = a.split(splitStr);
            String[] itemArr = b.split(splitStr);
            Arrays.sort(nodeArr);
            Arrays.sort(itemArr);
            if (Arrays.equals(nodeArr, itemArr)) {
                return true;
            }
        }
        return false;
    }

}
